{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 描述自己对于Map-Reduce的理解"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1）Map-Reduce：分布式处理策略，计算模型，对海量数据处理"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "   * 针对需要处理海量数据的需求，本节课中引入了Hadoop系统，Hadoop分布式文件系统，即HDFS(Hadoop Distributed File System)。\n",
    "   * Map-Reduce分布式处理策略和计算模型广泛应用于HDFS中，所以本章内容重点介绍了Map-Reduce的概念、方法及应用案例。\n",
    "   * 为什么要使用Map-Reduce方法？\n",
    "      1) 解决内从不足的问题；降低内存压力；\n",
    "      2) 提升运行速度"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2）Map-Reduce总览"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Map-Reduce方法总结为以下3个步骤：\n",
    "   1) Map:\n",
    "      * 逐个文件逐行扫描\n",
    "      * 扫描的同时抽取出我们感兴趣的内容（Keys）\n",
    "   2) Group by Key:\n",
    "      * 排序和洗牌（根据Key）\n",
    "   3) Reduce:\n",
    "      * 聚合，总结，过滤或转换\n",
    "      * 写入结果"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3）Map-Reduce应用案例"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 我们之前做过一个词频统计的案例\n",
    "### 假设我们手头上有一个超大的文本文件，需要统计每个文本中的词出现的次数。\n",
    "   * 所有词和频次对<word, count> 都超出了内存大小\n",
    "   * 让我们利用Map-Reduce方法解决这个问题\n",
    "   * 首先，让Map函数对文件顺序扫描，对每一条记录，生成键值对<word, count>（请注意，由于这里只是顺序扫描排列，所以所有的count都是“1”）\n",
    "   * 第二步，通过Group by Key对word进行排序（本质就是sort）\n",
    "   * 第三步，通过Reduce函数对相同的word进行聚合，得到每个word实际的count。比如，如果“the”这个词出现过3次，那么Reduce后会得到键值对<the, 3"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4）总结"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 以上是自己对Map-Reduce方法的基本理解\n",
    "### 在课程中，老师还延展了具体使用Map-Reduce时的一些概念，例如，中间键值对、Map和Reduce运行效率的区别、Map-Reduce方法的循环迭代使用等\n",
    "### 以下是老师PPT中总结的要点，在此也做好记录，便于以后回顾和进一步理解。\n",
    "\n",
    "   * reduce需要写函数，map有时候都不用写\n",
    "   * map工作主要修改key ，reduce主要修改values\n",
    "   * 对已有的算法进行map-reduce化\n",
    "   * map 对一个键值对输入产生一序列中间键值对\n",
    "   * map函数将对所有输入键值对操作\n",
    "   * 相同的key 值 v 被reduce放一起，Reduce函数对每一个不同的key进行操作\n",
    "   * map和reduce属于分治思想，通过hash分桶来处理，map是发散的过程，reduce是收敛的过程\n",
    "   * map任务数目要远大于Reduce\n",
    "   * map-reduce会有输入和输出，输出后再次进入map-reduce，如此循环迭代，在磁盘级别的操作，所以开销会很大，spark是在内存级别的操作，所有对内存开销会很大，但速度很快，spark稳定不如map，spark只读一次\n",
    "   * map-reduce主要做特征的转换，数据的提取，转换，处理，写入做特征的用map，reduce，导出的特征用于机器学习训练的用spark建模， 用hadoop streaming方便任何语言编写map-reduce"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
